package com.xflib.framework.util;

import cn.hutool.core.util.StrUtil;
import com.xflib.framework.common.ApplicationContext;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * @author zhong
 * 思路：
 * 1.读取配置文件(包括本地文选项、哪些资源文件)
 * 2.根据配置文件读取对应本地语言所有的国际化资源文件
 * 3.将所有国际化资源文件存放到map中
 * 4.提供
 *
 */
public class I18nUtil {

    private static Map<String, String> i18nMap = new HashMap<String, String>();

    //加载这个类的时候就执行该静态方法
    static{
        load();
    }

    // 初始化国际化资源
    private static void load() {
        try {
            // 获取资源文件根路径
            String homePath = ApplicationContext.getApplicationHome(I18nUtil.class);
            homePath = homePath.concat("i18n").concat(File.separator);

            File i18n=new File(homePath);
            if(i18n.exists()){
                Optional.ofNullable(i18n.listFiles((dir, name) -> name.endsWith(".properties")))
                        .ifPresent(array-> Arrays.asList(array).forEach(f->{ Properties p =new Properties();
                            try (InputStreamReader in = new InputStreamReader(new FileInputStream(f), "UTF-8");){
                                p.load(in);
                                p.forEach((k,v)->i18nMap.put((String)k,(String)v));
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static String get(String key, List<Object> args) {
        return getOrDefault(key, null, key);
    }

    public static String get(String key) {
        return getOrDefault(key, key);
    }
//    public static String getOrDefault(String key, String defaultValue) {
//        return getOrDefault(key,defaultValue,null);
//    }
    public static String getOrDefault(String key, String defaultValue, String... args) {
        String str = "";
        if(i18nMap.containsKey(key)){
            str = i18nMap.get(key);
        }
        str = StrUtil.isBlank(str)?defaultValue:str;
        if(null!=args && args.length>0){
            str=String.format(str, args);
        }
        return str;
    }

    public static Set<String> getKeys() {
        Set<String> set = null;
        if(i18nMap != null && i18nMap.size() > 0){
            set = new HashSet<String>();
            for(Map.Entry<String, String> entry:i18nMap.entrySet()){
                set.add(entry.getKey());
            }
            return set;
        }else{
            return set;
        }
    }

    public static void main(String[] args) {
        System.out.println(getKeys().toString());
    }

}

